package com.ass.nacos.service;

import com.alibaba.nacos.api.naming.pojo.Instance;

import java.util.List;

public interface NacosApiService {

    /**
     * @describe：获取配置
     * @author：李勇
     * @date：2024/3/6
     * @param dataId 配置 ID，采用类似 package.class（如com.taobao.tc.refund.log.level）
     *               的命名规则保证全局唯一性，class 部分建议是配置的业务含义。
     *               全部字符小写。只允许英文字符和 4 种特殊字符（”.”、”:”、”-”、”_”），不超过 256 字节。
     * @param group 配置分组，建议填写产品名:模块名（Nacos）保证唯一性，
     *              只允许英文字符和4种特殊字符（”.”、”:”、”-”、”_”），不超过128字节。
     * @param timeoutMs 读取配置超时时间，单位 ms，推荐值 3000。
     * @return：java.lang.String
     */
    String getConfigValue(String dataId, String group, Long timeoutMs);


    /**
     * @describe：发布配置,用于通过程序自动发布,Nacos配置,以便通过自动化手段降低运维成本。
     * @author：李勇
     * @date：2024/3/6
     * @param dataId 配置 ID，采用类似 package.class（如com.taobao.tc.refund.log.level）
     *         的命名规则保证全局唯一性，class 部分建议是配置的业务含义。
     *         全部字符小写。只允许英文字符和 4 种特殊字符（”.”、”:”、”-”、”_”），不超过 256 字节。
     * @param group 配置分组，建议填写产品名:模块名（Nacos）保证唯一性，
     *              只允许英文字符和4种特殊字符（”.”、”:”、”-”、”_”），不超过128字节。
     * @param content 配置内容，不超过 100K 字节。
     * @param type @Since 1.4.1. 配置类型，见 com.alibaba.nacos.api.config.ConfigType，默认为TEXT
     * @return：boolean
     */
    boolean publishConfig(String dataId, String group, String content, String type);


    /**
     * @describe：删除配置,用于通过程序自动发布,Nacos配置,以便通过自动化手段降低运维成本。
     * @author：李勇
     * @date：2024/3/6
     * @param dataId 配置 ID，采用类似 package.class（如com.taobao.tc.refund.log.level）
     *         的命名规则保证全局唯一性，class 部分建议是配置的业务含义。
     *         全部字符小写。只允许英文字符和 4 种特殊字符（”.”、”:”、”-”、”_”），不超过 256 字节。
     * @param group 配置分组，建议填写产品名:模块名（Nacos）保证唯一性，
     *              只允许英文字符和4种特殊字符（”.”、”:”、”-”、”_”），不超过128字节。
     * @return：boolean
     */
    boolean removeConfig(String dataId, String group);


    //服务和实例的关系 一个服务里面有多个实例(提供服务的jar)

    /**
     * @describe：向某一个服务下注册一个实例
     * @author：李勇
     * @date：2024/3/7
     * @param serviceName 服务名
     * @param ip
     * @param port
     * @return：void
     */
    boolean registerInstance(String serviceName, String ip, int port);

    /**
     * @describe：向某一个服务下注册一个实例
     * @author：李勇
     * @date：2024/3/7
     * @param serviceName 服务名
     * @param instance 属性信息
     * @return：void
     */
    boolean registerInstance(String serviceName, Instance instance);

    /**
     * @describe：注销实例，某个服务下的某一个实例
     * @author：李勇
     * @date：2024/3/7
     * @param serviceName 服务名
     * @param ip
     * @param port
     * @return：void
     */
    boolean deregisterInstance(String serviceName, String ip, int port);

    /**
     * @describe：获得全部实例
     * @author：李勇
     * @date：2024/3/7
     * @param serviceName
     * @return：java.util.List<com.alibaba.nacos.api.naming.pojo.Instance>
     */
    List<Instance> getAllInstances(String serviceName);


    /**
     * @describe：获取健康或者不健康的实例
     * @author：李勇
     * @date：2024/3/7
     * @param serviceName 服务名
     * @param healthy true 健康 false 不健康
     * @return：java.util.List<com.alibaba.nacos.api.naming.pojo.Instance>
     */
    List<Instance> selectInstances(String serviceName, boolean healthy);

    /**
     * @describe：获得一个健康实例
     * @author：李勇
     * @date：2024/3/7
     * @param serviceName
     * @return：com.alibaba.nacos.api.naming.pojo.Instance
     */
    Instance selectOneHealthyInstance(String serviceName);

}
